﻿#include <interface.h>                    // 包含接口定义文件
#include "market/ctp_api_market.h"        // 包含 CTP 行情 API 的头文件
#include "market/tap_api_market.h"        // 包含 TAP 行情 API 的头文件

#include "trader/ctp_api_trader.h"        // 包含 CTP 交易 API 的头文件
#include "trader/tap_api_trader.h"        // 包含 TAP 交易 API 的头文件

// 创建实际市场对象的工厂函数
// 参数：
// - id_excg_map: 指向交易所 ID 映射表的智能指针
// - config: 行情参数配置
// 返回值：根据配置创建并返回对应的市场对象指针
actual_market* create_actual_market(const std::shared_ptr<std::unordered_map<std::string, std::string>>& id_excg_map, const params& config)
{
    // 从配置中获取市场类型
    auto market_type = config.get<std::string>("market");
    // 根据市场类型创建相应的市场对象
    if (market_type == "ctp_api")
    {
        // 创建 CTP 行情市场对象
        return new ctp_api_market(id_excg_map, config);
    }
    if (market_type == "tap_api")
    {
        // 创建 TAP 行情市场对象
        return new tap_api_market(id_excg_map, config);
    }
    // 如果市场类型不匹配，返回空指针
    return nullptr;
}

// 销毁实际市场对象的函数
// 参数：
// - api: 指向实际市场对象的指针引用
void destory_actual_market(actual_market*& api)
{
    // 检查指针是否为空，若不为空则删除对象并置空
    if (nullptr != api)
    {
        delete api;  // 删除对象
        api = nullptr;  // 将指针置为 nullptr 防止重复删除
    }
}

// 创建实际交易对象的工厂函数
// 参数：
// - id_excg_map: 指向交易所 ID 映射表的智能指针
// - config: 交易参数配置
// 返回值：根据配置创建并返回对应的交易对象指针
actual_trader* create_actual_trader(const std::shared_ptr<std::unordered_map<std::string, std::string>>& id_excg_map, const params& config)
{
    // 从配置中获取交易类型
    auto trader_type = config.get<std::string>("trader");
    // 根据交易类型创建相应的交易对象
    if (trader_type == "ctp_api")
    {
        // 创建 CTP 交易对象
        return new ctp_api_trader(id_excg_map, config);
    }
    if (trader_type == "tap_api")
    {
        // 创建 TAP 交易对象
        return new tap_api_trader(id_excg_map, config);
    }
    // 如果交易类型不匹配，返回空指针
    return nullptr;
}

// 销毁实际交易对象的函数
// 参数：
// - api: 指向实际交易对象的指针引用
void destory_actual_trader(actual_trader*& api)
{
    // 检查指针是否为空，若不为空则删除对象并置空
    if (nullptr != api)
    {
        delete api;  // 删除对象
        api = nullptr;  // 将指针置为 nullptr 防止重复删除
    }
}
